package com.itmake.sample.mqtt.factory;

import com.itmake.sample.mqtt.config.MqttConfig;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;
import org.springframework.integration.mqtt.core.MqttPahoClientFactory;

import javax.annotation.Resource;

/**
 * mqtt client 工厂类
 *
 * @author Amjacks
 * @since 2021/04/21
 */
@Configuration
public class MqttFactory {

    @Resource
    private MqttConfig mqttConfig;

    /**
     * MQTT连接器选项
     *
     * @return {@link MqttConnectOptions}
     */
    @Bean
    public MqttConnectOptions getMqttConnectOptions() {
        MqttConnectOptions options = new MqttConnectOptions();
        // 设置是否清空 session,这里如果设置为 false 表示服务器会保留客户端的连接记录，
        // 这里设置为 true 表示每次连接到服务器都以新的身份连接
        options.setCleanSession(mqttConfig.getCleanSession());
        // 设置超时时间 单位为秒
        options.setConnectionTimeout(mqttConfig.getTimeout());
        // 设置会话心跳时间 单位为秒 服务器会每隔 1.5*20 秒的时间向客户端发送心跳判断客户端是否在线，但这个方法并没有重连的机制
        options.setKeepAliveInterval(mqttConfig.getKeepalive());
        // 设置连接的用户名
        options.setUserName(mqttConfig.getUsername());
        // 设置连接的密码
        options.setPassword(mqttConfig.getPassword().toCharArray());
        // 设置“遗嘱”消息的话题，若客户端与服务器之间的连接意外中断，服务器将发布客户端的“遗嘱”消息。
        // options.setWill("willTopic", "xxx主机掉线", 2, false);
        options.setAutomaticReconnect(true);
        options.setServerURIs(new String[]{mqttConfig.getUrl()});
        options.setMaxInflight(mqttConfig.getMaxInflight());
        return options;
    }

    /**
     * MQTT客户端
     *
     * @return {@link MqttPahoClientFactory}
     */
    @Bean
    public MqttPahoClientFactory mqttClientFactory() {
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        factory.setConnectionOptions(getMqttConnectOptions());
        return factory;
    }
}
